﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BusinessLayer.Model.Entities;

namespace BusinessLayer.Model.Repositories.Abstract
{
    /// <summary>
    /// Interface que define los metodos que debe implementar el repositorio de noticias
    /// </summary>
    public interface INewsRepository
    {
        /// <summary>
        /// Obtiene una noticia del repositorio que concuerda con el título especificado
        /// </summary>
        /// <param name="title">Título de la noticia</param>
        /// <returns>Noticia</returns>
        News              FetchByTitle(string title);

        /// <summary>
        /// Obtiene una noticia del repositorio que concuerda con el id especificado
        /// </summary>
        /// <param name="id">Id de la noticia</param>
        /// <returns>Noticia</returns>
        News              FetchByID(Guid id);

        /// <summary>
        /// Obtiene una lista de todas las noticias que existen en el repositorio
        /// </summary>
        /// <returns>Lista de noticias</returns>
        IEnumerable<News> FetchAll();

        /// <summary>
        /// Obtiene una lista de las últimas N noticias que existen en el repositorio
        /// </summary>
        /// <param name="amount">Cantidad de noticias</param>
        /// <returns>Lista de las últimas N noticias</returns>
        IEnumerable<News> FetchLastNews(int amount);

        /// <summary>
        /// Inserta una noticia en el repositorio
        /// </summary>
        /// <param name="news">Noticia a insertar</param>
        void              InsertOnSubmit(News news);

        /// <summary>
        /// Inserta una noticia en el repositorio
        /// </summary>
        /// <param name="title">Título de la noticia</param>
        /// <param name="description">Descripción de la noticia</param>
        /// <param name="content">Contenido de la noticia</param>
        void              InsertOnSubmit(string title, string description, string content);

        /// <summary>
        /// Actualiza una noticia del repositorio
        /// </summary>
        /// <param name="news">Noticia a actualizar</param>
        void              UpdateOnSubmit(News news);

        /// <summary>
        /// Elimina una noticia del repositorio
        /// </summary>
        /// <param name="news"></param>
        void              DeleteOnSubmit(News news);

        /// <summary>
        /// Guarda los cambios hechos al repositorio
        /// </summary>
        void              SubmitChanges();        
    }
}
